//我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后，我们仍可以得到一个有效的，且和 X 不同的数。要求每位数字都要被旋转。 
//
// 如果一个数的每位数字被旋转以后仍然还是一个数字， 则这个数是有效的。0, 1, 和 8 被旋转后仍然是它们自己；2 和 5 可以互相旋转成对方（在这种情况
//下，它们以不同的方向旋转，换句话说，2 和 5 互为镜像）；6 和 9 同理，除了这些以外其他的数字旋转以后都不再是有效的数字。 
//
// 现在我们有一个正整数 N, 计算从 1 到 N 中有多少个数 X 是好数？ 
//
// 
//
// 示例： 
//
// 输入: 10
//输出: 4
//解释: 
//在[1, 10]中有四个好数： 2, 5, 6, 9。
//注意 1 和 10 不是好数, 因为他们在旋转之后不变。
// 
//
// 
//
// 提示： 
//
// 
// N 的取值范围是 [1, 10000]。 
// 
// Related Topics数学 | 动态规划 
//
// 👍 132, 👎 0 
//
//
//
//

package leetcode.editor.day;

// 788. 旋转数字
// https://leetcode.cn/problems/rotated-digits/
class RotatedDigits {
    public static void main(String[] args) {
        Solution solution = new RotatedDigits().new Solution();
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        // 一个数是好数的要求：
        // 1.不存在3、4、7 (他们不能旋转，不是一个有效数字)
        // 2.存在2、5、6、9其中一个9 (他们旋转有效，且和原来数值不相同)
        // 3.0、1、8没有要求，可有可无
        public int rotatedDigits(int n) {
            // 用来标识
            int[] check = new int[]{0, 0, 1, -1, -1, 1, 1, -1, 0, 1};
            int ans = 0;
            for (int i = 1; i < n; i++) {
                String s = String.valueOf(i);
                // valid标识第一个条件，diff标识第二个条件
                boolean valid = true, diff = false;
                for (int j = 0; j < s.length(); j++) {
                    char c = s.charAt(j);
                    if (check[c - '0'] == -1) {
                        valid = false;
                    } else if (check[c - '0'] == 1) {
                        diff = true;
                    }
                }

                // 这两个条件满足
                if (valid && diff) ans++;
            }

            return ans;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}
